home *** CD-ROM | disk | FTP | other *** search
- package eval;
-
- public class MyDecimal {
- private static final String PI_STR = "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110";
- private static final boolean POSITIVE = false;
- private static final boolean NEGATIVE = true;
- private static int precision = 20;
- private byte[] val;
- private int ndot;
- private int len;
- private boolean negative;
-
- public MyDecimal() {
- this.ndot = this.len = 0;
- this.negative = false;
- }
-
- public MyDecimal(MyDecimal var1) {
- this.ndot = var1.ndot;
- this.len = var1.len;
- this.negative = var1.negative;
- this.val = null;
- if (this.len > 0) {
- this.val = new byte[this.len];
- System.arraycopy(var1.val, 0, this.val, 0, this.len);
- }
-
- }
-
- public MyDecimal(String var1) {
- int var2 = var1.length();
- byte[] var3 = var1.getBytes();
- this.ndot = var1.indexOf(46);
- if (this.ndot >= 0) {
- --var2;
- System.arraycopy(var3, this.ndot + 1, var3, this.ndot, var2 - this.ndot);
- } else {
- this.ndot = var2;
- }
-
- this.negative = false;
- if (var3[0] == 45) {
- this.negative = true;
- --var2;
- --this.ndot;
- System.arraycopy(var3, 1, var3, 0, var2);
- }
-
- this.val = new byte[var2];
-
- for(int var4 = 0; var4 < var2; ++var4) {
- byte var5 = var3[var4];
- this.val[var4] = (byte)(var5 - 48);
- }
-
- this.len = var2;
- }
-
- private MyDecimal(byte[] var1, int var2, int var3, boolean var4) {
- this.val = new byte[var2];
- System.arraycopy(var1, 0, this.val, 0, var2);
- this.len = var2;
- this.ndot = var3;
- this.negative = var4;
- }
-
- // $FF: renamed from: PI () eval.MyDecimal
- public static MyDecimal method_0() {
- return new MyDecimal("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110".substring(0, precision + 2));
- }
-
- public MyDecimal abs() {
- MyDecimal var1 = new MyDecimal(this);
- var1.negative = false;
- return var1;
- }
-
- public MyDecimal add(MyDecimal var1) {
- if (this.negative == var1.negative) {
- return this.add0(var1, this.negative);
- } else if (this.greater0(var1)) {
- return this.sub0(var1, this.negative);
- } else {
- MyDecimal var2 = var1.sub0(this, var1.negative);
- return var2;
- }
- }
-
- private MyDecimal add0(MyDecimal var1, boolean var2) {
- byte var3 = 0;
- int var4 = this.ndot > var1.ndot ? this.ndot : var1.ndot;
- int var5 = this.len - this.ndot > var1.len - var1.ndot ? this.len - this.ndot : var1.len - var1.ndot;
- ++var4;
- int var6 = var4 + var5;
- this.normalize2(var4, var6);
- var1.normalize2(var4, var6);
- byte[] var7 = new byte[var6];
-
- for(int var8 = var6 - 1; var8 >= 0; --var8) {
- var3 = (byte)(var3 + this.val[var8] + var1.val[var8]);
- var7[var8] = (byte)(var3 % 10);
- var3 = (byte)(var3 / 10);
- }
-
- return new MyDecimal(var7, var6, var4, var2);
- }
-
- private void addRight(byte var1, boolean var2) {
- byte[] var3 = new byte[this.len + 1];
- if (this.len != 0) {
- System.arraycopy(this.val, 0, var3, 0, this.len);
- }
-
- var3[this.len++] = var1;
- if (!var2) {
- ++this.ndot;
- }
-
- this.val = var3;
- }
-
- public MyDecimal beforePoint() {
- return new MyDecimal(this.val, this.ndot, this.ndot, this.negative);
- }
-
- public MyDecimal cos() {
- MyDecimal var1 = this.normalizeToPrecision().mod2PI();
- MyDecimal var2 = new MyDecimal("1");
- MyDecimal var3 = getDelta(precision);
- MyDecimal var5 = new MyDecimal("1");
- MyDecimal var6 = var1.multiply(var1);
- MyDecimal var7 = new MyDecimal("1");
- boolean var8 = true;
- int var9 = 2;
-
- MyDecimal var4;
- try {
- do {
- var5 = var5.multiply(var6);
- var7 = var7.multiply(new MyDecimal(Integer.toString(var9 - 1))).multiply(new MyDecimal(Integer.toString(var9)));
- var4 = var5.divide(var7);
- var4.negative = var8;
- var2 = var2.add(var4);
- var8 ^= true;
- var9 += 2;
- } while(var4.greater0(var3));
- } catch (Exception var10) {
- }
-
- return var2;
- }
-
- public MyDecimal divide(MyDecimal var1) throws MyDecimalException {
- if (var1.isZero()) {
- throw new MyDecimalException("divide by zero");
- } else {
- MyDecimal var3 = new MyDecimal();
- MyDecimal var4 = new MyDecimal();
- boolean var6 = false;
- int var7 = this.len - this.ndot > var1.len - var1.ndot ? this.len - this.ndot : var1.len - var1.ndot;
- MyDecimal var2 = this.shift(var7);
-
- boolean var5;
- MyDecimal var9;
- for(var1 = var1.shift(var7); !(var5 = var2.isZero() && var2.ndot <= 0) || !var3.isZero() && var4.len - var4.ndot < precision; var3 = var3.sub0(var9, false)) {
- if (var5 && var2.ndot <= 0) {
- var3.addRight((byte)0, false);
- var6 = true;
- } else {
- var3.addRight(var2.val[0], false);
- var2.removeLeft(1);
- }
-
- byte var8 = 0;
- var9 = new MyDecimal();
-
- for(MyDecimal var10 = new MyDecimal(var1); !var10.greater0(var3); ++var8) {
- var9 = var10;
- var10 = var10.add0(var1, false);
- }
-
- var4.addRight(var8, var6);
- }
-
- var4.negative = this.negative != var1.negative;
- return var4;
- }
- }
-
- public static MyDecimal getDelta(int var0) {
- byte[] var1 = new byte[var0];
-
- for(int var2 = 0; var2 < var0; ++var2) {
- var1[var2] = 0;
- }
-
- var1[var0 - 1] = 1;
- return new MyDecimal(var1, var0, 0, false);
- }
-
- public static int getPrecision() {
- return precision;
- }
-
- private boolean greater0(MyDecimal var1) {
- this.normalize();
- var1.normalize();
- if (this.ndot > var1.ndot) {
- return true;
- } else if (this.ndot < var1.ndot) {
- return false;
- } else {
- for(int var2 = 0; var2 < this.len; ++var2) {
- if (var2 >= this.len) {
- return true;
- }
-
- if (this.val[var2] > var1.val[var2]) {
- return true;
- }
-
- if (this.val[var2] < var1.val[var2]) {
- return false;
- }
- }
-
- return false;
- }
- }
-
- public boolean isZero() {
- for(int var1 = 0; var1 < this.len; ++var1) {
- if (this.val[var1] != 0) {
- return false;
- }
- }
-
- return true;
- }
-
- public MyDecimal mod(MyDecimal var1) throws MyDecimalException {
- MyDecimal var2 = this.divide(var1).beforePoint();
- var2 = var1.multiply(var2);
- var2 = this.subtract(var2);
- return var2;
- }
-
- private MyDecimal mod2PI() {
- MyDecimal var1 = new MyDecimal();
-
- try {
- var1 = this.mod(method_0().multiply1((byte)2));
- } catch (MyDecimalException var2) {
- }
-
- return var1;
- }
-
- public MyDecimal multiply(MyDecimal var1) {
- MyDecimal var2 = new MyDecimal();
- boolean var3 = this.negative != var1.negative;
-
- for(int var4 = this.len - 1; var4 >= 0; --var4) {
- var2 = var2.add0(var1.multiply1(this.val[var4]).shift(this.len - 1 - var4), var3);
- }
-
- var2.ndot = var2.len - (this.len - this.ndot + var1.len - var1.ndot);
- return var2;
- }
-
- private MyDecimal multiply1(byte var1) {
- byte var2 = 0;
- byte[] var3 = new byte[this.len + 1];
-
- for(int var4 = this.len - 1; var4 >= 0; --var4) {
- var2 = (byte)(var2 + this.val[var4] * var1);
- var3[var4 + 1] = (byte)(var2 % 10);
- var2 = (byte)(var2 / 10);
- }
-
- var3[0] = var2;
- MyDecimal var5 = new MyDecimal(var3, this.len + 1, this.ndot + 1, this.negative);
- return var5;
- }
-
- private void normalize() {
- if (this.len != 0) {
- if (this.len > this.ndot && this.val[this.len - 1] == 0) {
- do {
- --this.len;
- } while(this.len > this.ndot && this.val[this.len - 1] == 0);
- }
-
- while(this.ndot > 0 && this.val[0] == 0) {
- --this.len;
- --this.ndot;
- System.arraycopy(this.val, 1, this.val, 0, this.len);
- }
-
- }
- }
-
- private void normalize2(int var1, int var2) {
- byte[] var3 = new byte[var2];
-
- for(int var4 = 0; var4 < var2; ++var4) {
- var3[var4] = 0;
- }
-
- if (this.len != 0) {
- System.arraycopy(this.val, 0, var3, var1 - this.ndot, this.len);
- }
-
- this.val = var3;
- this.ndot = var1;
- this.len = var2;
- }
-
- public MyDecimal normalizeToPrecision() {
- int var1 = this.len - this.ndot - precision;
- MyDecimal var2;
- if (var1 > 0) {
- var2 = new MyDecimal(this.val, this.len - var1, this.ndot, this.negative);
- } else {
- var2 = new MyDecimal(this);
- }
-
- return var2;
- }
-
- public MyDecimal power(int var1) {
- if (var1 <= 0) {
- return new MyDecimal("1");
- } else {
- MyDecimal var2 = new MyDecimal(this);
-
- while(true) {
- --var1;
- if (var1 <= 0) {
- return var2;
- }
-
- var2 = var2.multiply(this);
- }
- }
- }
-
- private void removeLeft(int var1) {
- this.len -= var1;
- this.ndot -= var1;
- if (this.len > 0) {
- byte[] var2 = new byte[this.len];
- System.arraycopy(this.val, var1, var2, 0, this.len);
- this.val = var2;
- } else {
- this.val = null;
- }
-
- }
-
- public void reverse() {
- this.negative ^= true;
- }
-
- public static void setPrecision(int var0) {
- precision = var0;
- }
-
- private MyDecimal shift(int var1) {
- int var2 = this.ndot + var1;
- int var3 = var2 > this.len ? var2 : this.len;
- byte[] var4 = new byte[var3];
- System.arraycopy(this.val, 0, var4, 0, this.len);
-
- for(int var5 = this.len; var5 < var3; ++var5) {
- var4[var5] = 0;
- }
-
- MyDecimal var6 = new MyDecimal(var4, var3, this.ndot + var1, this.negative);
- return var6;
- }
-
- public MyDecimal sin() {
- MyDecimal var1 = this.normalizeToPrecision().mod2PI();
- MyDecimal var2 = new MyDecimal(var1);
- MyDecimal var3 = getDelta(precision);
- MyDecimal var5 = new MyDecimal(var1);
- MyDecimal var6 = var1.multiply(var1);
- MyDecimal var7 = new MyDecimal("1");
- boolean var8 = true;
- int var9 = 3;
-
- MyDecimal var4;
- try {
- do {
- var5 = var5.multiply(var6);
- var7 = var7.multiply(new MyDecimal(Integer.toString(var9 - 1))).multiply(new MyDecimal(Integer.toString(var9)));
- var4 = var5.divide(var7);
- var4.negative = var8;
- var2 = var2.add(var4);
- var8 ^= true;
- var9 += 2;
- } while(var4.greater0(var3));
- } catch (Exception var10) {
- }
-
- return var2;
- }
-
- private MyDecimal sub0(MyDecimal var1, boolean var2) {
- int var3 = this.ndot > var1.ndot ? this.ndot : var1.ndot;
- int var4 = this.len - this.ndot;
- if (var1.len - var1.ndot > var4) {
- var4 = var1.len - var1.ndot;
- }
-
- var4 += var3;
- this.normalize2(var3, var4);
- var1.normalize2(var3, var4);
- byte[] var5 = new byte[var4];
- boolean var6 = false;
-
- for(int var7 = var4 - 1; var7 >= 0; --var7) {
- byte var8 = this.val[var7];
- byte var9 = var1.val[var7];
- if (var6) {
- --var8;
- }
-
- var6 = false;
- if (var8 < var9) {
- var8 = (byte)(var8 + 10);
- var6 = true;
- }
-
- var5[var7] = (byte)(var8 - var9);
- }
-
- return new MyDecimal(var5, var4, var3, var2);
- }
-
- public MyDecimal subtract(MyDecimal var1) {
- MyDecimal var2 = new MyDecimal(var1);
- var2.negative ^= true;
- return this.add(var2);
- }
-
- public String toString() {
- MyDecimal var1 = new MyDecimal(this);
- var1.normalize();
- StringBuffer var2 = new StringBuffer(var1.len + 3);
- if (var1.negative) {
- var2.append('-');
- }
-
- if (var1.ndot == 0) {
- var2.append('0');
- }
-
- for(int var3 = 0; var3 < var1.len; ++var3) {
- if (var3 == var1.ndot && var1.ndot != var1.len) {
- var2.append('.');
- }
-
- var2.append((char)(var1.val[var3] + 48));
- }
-
- return var2.toString();
- }
- }
-